#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

void handler(int signo){

    cout << "signo = " << signal << endl;
    exit(1);
}

void showBlock(sigset_t *oset){
    for (int signo = 1; signo <= 31;signo++){
        if(sigismember(oset,signo)){
            cout << "1";
        }else{
            cout << "0";
        }
    }
    cout << endl;
}

int main(){
    
    // //除0问题
    // signal(SIGFPE, handler);
    // int a = 1;
    // a /= 0;
    // cout << "除0" << endl;

    // //野指针问题
    // signal(SIGSEGV, handler);
    // int *p = nullptr;
    // //int p = 1;
    // *p = 1;
    // cout << "野指针" << endl;


    // //kill发送信号
    // while(1){
    //     cout << "pid = " << getpid() << endl;
    //     sleep(1);
    // }

    //SIG_DFL = 0, SIG_IGN = 1, 都被强转成hanlder的函数指针数组类型
    //signal(2, SIG_DFL);
    //signal(2, SIG_IGN);

    // pid_t id = fork();
    // if(id == 0){
    //     sleep(1);
    //     cout << "野指针↓" << endl;
    //     int *p = nullptr;
    //     *p = 1;
    //     cout << "野指针↑" << endl;
    // }
    // int status = 0;
    // waitpid(id, &status, 0);
    // cout << "exit code: " << ((status >> 8) & 0xff) << endl;
    // cout << "exit signal: " << (status & 0x7f) << endl;
    // cout << "core dump flag: " << ((status >> 7) & 0x1) << endl;


    //信号集操作
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    sigaddset(&set, 2);

    //写入进程，谁调用谁就被设置
    sigprocmask(SIG_SETMASK, &set, &oset);

    int cnt = 0;
    while(1){
        showBlock(&oset);
        sleep(1);
        if(cnt == 5){
            //恢复
            cout << "recover block" << endl;
            sigprocmask(SIG_SETMASK, &oset, &set);
            showBlock(&set);
        }
        cnt++;
    }

    return 0;
}